package cn.spdb.harrier.server.worker.rpc.transport;

import cn.spdb.harrier.common.enmus.ExecutionStatus;
import cn.spdb.harrier.dao.utils.BeanContext;
import cn.spdb.harrier.rpc.common.RpcServiceHandler;
import cn.spdb.harrier.server.entity.ComplementIns;
import cn.spdb.harrier.server.entity.JobExecutionContext;
import cn.spdb.harrier.server.worker.WorkerManagerThread;
import cn.spdb.harrier.server.worker.exec.ComplementRunable;
import cn.spdb.harrier.server.worker.exec.TaskExecuteRunnable;
/**
 * WorkTransportServer 是一个基于 RPC 的任务传输服务实现类。
 * 主要负责接收远程任务调度请求，并将任务提交给 WorkerManagerThread 进行执行管理。
 */
@RpcServiceHandler("WorkTransportServerInterface")
public class WorkTransportServer implements WorkTransportServerInterface {

    /**
     * 从 Spring 容器中获取 WorkerManagerThread 实例，用于任务调度管理。
     */
    private static WorkerManagerThread workerManagerThread = BeanContext.getBean(WorkerManagerThread.class);

    /**
     * 分发正常作业任务到工作线程池。
     *
     * @param jobExecutionContext 任务执行上下文，包含任务相关信息
     * @return 如果任务成功入队并增加计数，则返回 true；否则返回 false
     */
    @Override
    public Boolean dispathcer(JobExecutionContext jobExecutionContext) {
        TaskExecuteRunnable taskExecuteRunnable = new TaskExecuteRunnable();
        jobExecutionContext.setExecutionStatus(ExecutionStatus.RUNING);
        taskExecuteRunnable.setJobExecutionContext(jobExecutionContext);
        if (workerManagerThread.offer(taskExecuteRunnable)) {
            workerManagerThread.incrementJob(taskExecuteRunnable.getJobExecutionContext());
            return true;
        }
        return false;
    }

    /**
     * 终止指定的任务实例。
     *
     * @param taskInstanceId 要终止的任务实例 ID
     * @return 始终返回 true，表示操作已执行（实际是否终止由内部逻辑决定）
     */
    @Override
    public Boolean killJob(Long taskInstanceId) {
        workerManagerThread.killTaskBeforeExecuteByInstanceId(taskInstanceId);
        return true;
    }

    /**
     * 分发补跑任务（Complement）并启动新线程执行。
     *
     * @param complementIns 补跑任务实例信息
     * @return 始终返回 true，表示任务已提交执行
     */
    @Override
    public Boolean dispathcerComplement(ComplementIns complementIns) {
        new Thread(new ComplementRunable(complementIns)).start();
        return true;
    }
}
